#!/bin/tcsh -xef

set path = ($path /data/brutus_data0/freeware/afni)
echo $path

echo "auto-generated by afni_proc.py, Mon Mar 19 23:19:23 2018"
echo "(version 5.15, April 25, 2017)"
echo "execution started: `date`"

# execute via : 
#   tcsh -xef proc.epi_proc.ACP1320 2>&1 | tee output.proc.epi_proc.ACP1320

# =========================== auto block: setup ============================
# script setup

# take note of the AFNI version
afni -ver

# check that the current AFNI version is recent enough
afni_history -check_date 23 Sep 2016
if ( $status ) then
    echo "** this script requires newer AFNI binaries (than 23 Sep 2016)"
    echo "   (consider: @update.afni.binaries -defaults)"
    exit
endif

# the user may specify a single subject to run with
if ( $#argv > 0 ) then
    set subj = $argv[1]
else
    set subj = ${subj}
endif

# assign output directory name
set output_dir = $subj.results

# verify that the results directory does not yet exist
if ( -d $output_dir ) then
    echo output dir "$subj.results" already exists
    exit
endif

# set list of runs
set runs = (`count -digits 2 1 2`)

# create results and stimuli directories
mkdir $output_dir
mkdir $output_dir/stimuli

# copy anatomy to results dir
#3dcopy vr_base_min_outlier+orig $output_dir/vr_base_min_outlier

# copy any -mask_import datasets as mask_import_LABEL
3dcopy /data/brutus_data12/badhikari/ACP_Analy//scr_ACP/vent.erode.18.nii \
    $output_dir/mask_import_vent
3dcopy /data/brutus_data12/badhikari/ACP_Analy//scr_ACP/wm.erode.18.nii   \
    $output_dir/mask_import_WM

# ============================ auto block: tcat ============================
# apply 3dTcat to copy input dsets to results dir, while
# removing the first 0 TRs
3dTcat -prefix $output_dir/pb00.$subj.r01.tcat rsfMRI_R1.nii.gz'[0..$]'
3dTcat -prefix $output_dir/pb00.$subj.r02.tcat rsfMRI_R2.nii.gz'[0..$]'

# and make note of repetitions (TRs) per run
set tr_counts = ( 840 840 )

# -------------------------------------------------------
# enter the results directory (can begin processing data)
cd $output_dir


# ========================== auto block: outcount ==========================
# data check: compute outlier fraction for each volume
touch out.pre_ss_warn.txt
foreach run ( $runs )
    3dToutcount -automask -fraction -polort 5 -legendre                     \
                pb00.$subj.r$run.tcat+orig > outcount.r$run.1D

    # censor outlier TRs per run, ignoring the first 0 TRs
    # - censor when more than 0.1 of automask voxels are outliers
    # - step() defines which TRs to remove via censoring
    1deval -a outcount.r$run.1D -expr "1-step(a-0.1)" > rm.out.cen.r$run.1D

    # outliers at TR 0 might suggest pre-steady state TRs
    if ( `1deval -a outcount.r$run.1D"{0}" -expr "step(a-0.4)"` ) then
        echo "** TR #0 outliers: possible pre-steady state TRs in run $run" \
            >> out.pre_ss_warn.txt
    endif
end

# catenate outlier counts into a single time series
cat outcount.r*.1D > outcount_rall.1D

# catenate outlier censor files into a single time series
cat rm.out.cen.r*.1D > outcount_${subj}_censor.1D

# get run number and TR index for minimum outlier volume
set minindex = `3dTstat -argmin -prefix - outcount_rall.1D\'`
set ovals = ( `1d_tool.py -set_run_lengths $tr_counts                       \
                          -index_to_run_tr $minindex` )
# save run and TR indices for extraction of vr_base_min_outlier
set minoutrun = $ovals[1]
set minouttr  = $ovals[2]
echo "min outlier: run $minoutrun, TR $minouttr" | tee out.min_outlier.txt

# ================================ despike =================================
# apply 3dDespike to each run
foreach run ( $runs )
    3dDespike -NEW -nomask -prefix pb01.$subj.r$run.despike \
        pb00.$subj.r$run.tcat+orig
end

# ================================= tshift =================================
# time shift data so all slice timing is the same 
foreach run ( $runs )
    3dTshift -tzero 0 -quintic -prefix pb02.$subj.r$run.tshift \
             pb01.$subj.r$run.despike+orig
end

# --------------------------------
# extract volreg registration base
3dbucket -prefix vr_base_min_outlier                           \
    pb02.$subj.r$minoutrun.tshift+orig"[$minouttr]"

# ================================== tlrc ==================================
# warp anatomy to standard space
@auto_tlrc -base                                                                 \
    /data/brutus_data12/badhikari/ACP_Analy//scr_ACP/ENIGMA_Template.tlrc.nii.gz \
    -input vr_base_min_outlier+orig

# store forward transformation matrix in a text file
cat_matvec vr_base_min_outlier+tlrc::WARP_DATA -I > warp.anat.Xat.1D

# ================================= volreg =================================
# align each dset to base volume, warp to tlrc space

# verify that we have a +tlrc warp dataset
if ( ! -f vr_base_min_outlier+tlrc.HEAD ) then
    echo "** missing +tlrc warp dataset: vr_base_min_outlier+tlrc.HEAD" 
    exit
endif

# register and warp
foreach run ( $runs )
    # register each volume to the base
    3dvolreg -verbose -zpad 1 -base vr_base_min_outlier+orig    \
             -1Dfile dfile.r$run.1D -prefix rm.epi.volreg.r$run \
             -cubic                                             \
             -1Dmatrix_save mat.r$run.vr.aff12.1D               \
             pb02.$subj.r$run.tshift+orig

    # create an all-1 dataset to mask the extents of the warp
    3dcalc -overwrite -a pb02.$subj.r$run.tshift+orig -expr 1   \
           -prefix rm.epi.all1

    # catenate volreg/tlrc xforms
    cat_matvec -ONELINE                                         \
               vr_base_min_outlier+tlrc::WARP_DATA -I           \
               mat.r$run.vr.aff12.1D > mat.r$run.warp.aff12.1D

    # apply catenated xform: volreg/tlrc
    3dAllineate -base vr_base_min_outlier+tlrc                  \
                -input pb02.$subj.r$run.tshift+orig             \
                -1Dmatrix_apply mat.r$run.warp.aff12.1D         \
                -mast_dxyz 2                                    \
                -prefix rm.epi.nomask.r$run

    # warp the all-1 dataset for extents masking 
    3dAllineate -base vr_base_min_outlier+tlrc                  \
                -input rm.epi.all1+orig                         \
                -1Dmatrix_apply mat.r$run.warp.aff12.1D         \
                -mast_dxyz 2 -final NN -quiet                   \
                -prefix rm.epi.1.r$run

    # make an extents intersection mask of this run
    3dTstat -min -prefix rm.epi.min.r$run rm.epi.1.r$run+tlrc
end

# make a single file of registration params
cat dfile.r*.1D > dfile_rall.1D

# ----------------------------------------
# create the extents mask: mask_epi_extents+tlrc
# (this is a mask of voxels that have valid data at every TR)
3dMean -datum short -prefix rm.epi.mean rm.epi.min.r*.HEAD 
3dcalc -a rm.epi.mean+tlrc -expr 'step(a-0.999)' -prefix mask_epi_extents

# and apply the extents mask to the EPI data 
# (delete any time series with missing data)
foreach run ( $runs )
    3dcalc -a rm.epi.nomask.r$run+tlrc -b mask_epi_extents+tlrc \
           -expr 'a*b' -prefix pb03.$subj.r$run.volreg
end

# warp the volreg base EPI dataset to make a final version
cat_matvec -ONELINE vr_base_min_outlier+tlrc::WARP_DATA -I >    \
    mat.basewarp.aff12.1D

3dAllineate -base vr_base_min_outlier+tlrc                      \
            -input vr_base_min_outlier+orig                     \
            -1Dmatrix_apply mat.basewarp.aff12.1D               \
            -mast_dxyz 2                                        \
            -prefix final_epi_vr_base_min_outlier

# create an anat_final dataset, aligned with stats
3dcopy vr_base_min_outlier+tlrc anat_final.$subj

# record final registration costs
3dAllineate -base final_epi_vr_base_min_outlier+tlrc -allcostX  \
            -input anat_final.$subj+tlrc |& tee out.allcostX.txt

# -----------------------------------------
# warp anat follower datasets (affine)
3dAllineate -source vr_base_min_outlier+orig                    \
            -master anat_final.$subj+tlrc                       \
            -final wsinc5 -1Dmatrix_apply warp.anat.Xat.1D      \
            -prefix anat_w_skull_warped

# ================================== blur ==================================
# blur each volume of each run
foreach run ( $runs )
    3dmerge -1blur_fwhm 4.0 -doall -prefix rm.pb04.$subj.r$run.blur  \
            pb03.$subj.r$run.volreg+tlrc

    # and apply extents mask, since no scale block
    3dcalc -a rm.pb04.$subj.r$run.blur+tlrc -b mask_epi_extents+tlrc \
           -expr 'a*b' -prefix pb04.$subj.r$run.blur
end

# ================================== mask ==================================
# create 'full_mask' dataset (union mask)
foreach run ( $runs )
    3dAutomask -dilate 1 -prefix rm.mask_r$run pb04.$subj.r$run.blur+tlrc
end

# create union of inputs, output type is byte
3dmask_tool -inputs rm.mask_r*+tlrc.HEAD -union -prefix full_mask.$subj

# ---- create subject anatomy mask, mask_anat.$subj+tlrc ----
#      (resampled from tlrc anat)
3dresample -master full_mask.$subj+tlrc -input vr_base_min_outlier+tlrc \
           -prefix rm.resam.anat

# convert to binary anat mask; fill gaps and holes
3dmask_tool -dilate_input 5 -5 -fill_holes -input rm.resam.anat+tlrc    \
            -prefix mask_anat.$subj

# compute overlaps between anat and EPI masks
3dABoverlap -no_automask full_mask.$subj+tlrc mask_anat.$subj+tlrc      \
            |& tee out.mask_ae_overlap.txt

# note Dice coefficient of masks, as well
3ddot -dodice full_mask.$subj+tlrc mask_anat.$subj+tlrc                 \
      |& tee out.mask_ae_dice.txt

# ---- create group anatomy mask, mask_group+tlrc ----
#      (resampled from tlrc base anat, ENIGMA_Template.tlrc.nii.gz)
3dresample -master full_mask.$subj+tlrc -prefix ./rm.resam.group        \
           -input                                                       \
           /data/brutus_data12/badhikari/ACP_Analy/scr_ACP/ENIGMA_Template.tlrc.nii.gz

# convert to binary group mask; fill gaps and holes
3dmask_tool -dilate_input 5 -5 -fill_holes -input rm.resam.group+tlrc   \
            -prefix mask_group

# ================================ regress =================================

# compute de-meaned motion parameters (for use in regression)
1d_tool.py -infile dfile_rall.1D -set_nruns 2                              \
           -demean -write motion_demean.1D

# compute motion parameter derivatives (for use in regression)
1d_tool.py -infile dfile_rall.1D -set_nruns 2                              \
           -derivative -demean -write motion_deriv.1D

# create censor file motion_${subj}_censor.1D, for censoring motion 
1d_tool.py -infile dfile_rall.1D -set_nruns 2                              \
    -show_censor_count -censor_prev_TR                                     \
    -censor_motion 0.2 motion_${subj}

# combine multiple censor files
1deval -a motion_${subj}_censor.1D -b outcount_${subj}_censor.1D           \
       -expr "a*b" > censor_${subj}_combined_2.1D

# note TRs that were not censored
set ktrs = `1d_tool.py -infile censor_${subj}_combined_2.1D                \
                       -show_trs_uncensored encoded`

# ------------------------------
# create ROI PC ort sets: vent

# create a time series dataset to run 3dpc on...

# detrend, so principal components are not affected
foreach run ( $runs )
    # to censor, create per-run censor files
    1d_tool.py -set_run_lengths $tr_counts -select_runs $run               \
               -infile censor_${subj}_combined_2.1D -write rm.censor.r$run.1D

    # do not let censored time points affect detrending
    3dTproject -polort 5 -prefix rm.det_pcin_r$run                         \
               -censor rm.censor.r$run.1D -cenmode KILL                    \
               -input pb03.$subj.r$run.volreg+tlrc
end

# catenate runs, prepare to censor TRs
3dTcat -prefix rm.det_pcin_rall rm.det_pcin_r*+tlrc.HEAD

# make ROI PCs : vent
3dpc -mask mask_import_vent+tlrc -pcsave 3                                 \
     -prefix rm.ROIPC.vent rm.det_pcin_rall+tlrc

# zero pad censored TRs
1d_tool.py -censor_fill_parent censor_${subj}_combined_2.1D                \
    -infile rm.ROIPC.vent_vec.1D                                           \
    -write ROIPC.vent.1D

# ------------------------------
# run the regression analysis
3dDeconvolve -input pb04.$subj.r*.blur+tlrc.HEAD                           \
    -censor censor_${subj}_combined_2.1D                                   \
    -ortvec ROIPC.vent.1D ROIPC.vent                                       \
    -polort 5 -float                                                       \
    -num_stimts 12                                                         \
    -stim_file 1 motion_demean.1D'[0]' -stim_base 1 -stim_label 1 roll_01  \
    -stim_file 2 motion_demean.1D'[1]' -stim_base 2 -stim_label 2 pitch_01 \
    -stim_file 3 motion_demean.1D'[2]' -stim_base 3 -stim_label 3 yaw_01   \
    -stim_file 4 motion_demean.1D'[3]' -stim_base 4 -stim_label 4 dS_01    \
    -stim_file 5 motion_demean.1D'[4]' -stim_base 5 -stim_label 5 dL_01    \
    -stim_file 6 motion_demean.1D'[5]' -stim_base 6 -stim_label 6 dP_01    \
    -stim_file 7 motion_deriv.1D'[0]' -stim_base 7 -stim_label 7 roll_02   \
    -stim_file 8 motion_deriv.1D'[1]' -stim_base 8 -stim_label 8 pitch_02  \
    -stim_file 9 motion_deriv.1D'[2]' -stim_base 9 -stim_label 9 yaw_02    \
    -stim_file 10 motion_deriv.1D'[3]' -stim_base 10 -stim_label 10 dS_02  \
    -stim_file 11 motion_deriv.1D'[4]' -stim_base 11 -stim_label 11 dL_02  \
    -stim_file 12 motion_deriv.1D'[5]' -stim_base 12 -stim_label 12 dP_02  \
    -fout -tout -x1D X.xmat.1D -xjpeg X.jpg                                \
    -x1D_uncensored X.nocensor.xmat.1D                                     \
    -fitts fitts.$subj                                                     \
    -errts errts.${subj}                                                   \
    -x1D_stop                                                              \
    -bucket stats.$subj

# -- use 3dTproject to project out regression matrix --
3dTproject -polort 0 -input pb04.$subj.r*.blur+tlrc.HEAD                   \
           -censor censor_${subj}_combined_2.1D -cenmode ZERO              \
           -ort X.nocensor.xmat.1D -prefix errts.${subj}.tproject



# if 3dDeconvolve fails, terminate the script
if ( $status != 0 ) then
    echo '---------------------------------------'
    echo '** 3dDeconvolve error, failing...'
    echo '   (consider the file 3dDeconvolve.err)'
    exit
endif


# display any large pairwise correlations from the X-matrix
1d_tool.py -show_cormat_warnings -infile X.xmat.1D |& tee out.cormat_warn.txt

# create an all_runs dataset to match the fitts, errts, etc.
3dTcat -prefix all_runs.$subj pb04.$subj.r*.blur+tlrc.HEAD

# --------------------------------------------------
# generate fast ANATICOR result: errts.$subj.fanaticor+tlrc

# --------------------------------------------------
# fast ANATICOR: generate local WM time series averages
# create catenated volreg dataset
3dTcat -prefix rm.all_runs.volreg pb03.$subj.r*.volreg+tlrc.HEAD

# mask white matter before blurring
3dcalc -a rm.all_runs.volreg+tlrc -b mask_import_WM+tlrc                   \
       -expr "a*bool(b)" -datum float -prefix rm.all_runs.volreg.mask

# generate ANATICOR voxelwise regressors via blur
3dmerge -1blur_fwhm 30 -doall -prefix Local_WM_rall                        \
    rm.all_runs.volreg.mask+tlrc

# -- use 3dTproject to project out regression matrix --
3dTproject -polort 0 -input pb04.$subj.r*.blur+tlrc.HEAD                   \
           -censor censor_${subj}_combined_2.1D -cenmode ZERO              \
           -dsort Local_WM_rall+tlrc                                       \
           -ort X.nocensor.xmat.1D -prefix errts.$subj.fanaticor

# --------------------------------------------------
# create a temporal signal to noise ratio dataset 
#    signal: if 'scale' block, mean should be 100
#    noise : compute standard deviation of errts
3dTstat -mean -prefix rm.signal.all all_runs.$subj+tlrc"[$ktrs]"
3dTstat -stdev -prefix rm.noise.all errts.$subj.fanaticor+tlrc"[$ktrs]"
3dcalc -a rm.signal.all+tlrc                                               \
       -b rm.noise.all+tlrc                                                \
       -c full_mask.$subj+tlrc                                             \
       -expr 'c*a/b' -prefix TSNR.$subj 

# ---------------------------------------------------
# compute and store GCOR (global correlation average)
# (sum of squares of global mean of unit errts)
3dTnorm -norm2 -prefix rm.errts.unit errts.$subj.fanaticor+tlrc
3dmaskave -quiet -mask full_mask.$subj+tlrc rm.errts.unit+tlrc             \
          > gmean.errts.unit.1D
3dTstat -sos -prefix - gmean.errts.unit.1D\' > out.gcor.1D
echo "-- GCOR = `cat out.gcor.1D`"

# ---------------------------------------------------
# compute correlation volume
# (per voxel: average correlation across masked brain)
# (now just dot product with average unit time series)
3dcalc -a rm.errts.unit+tlrc -b gmean.errts.unit.1D -expr 'a*b' -prefix rm.DP
3dTstat -sum -prefix corr_brain rm.DP+tlrc

# --------------------------------------------------------
# compute sum of non-baseline regressors from the X-matrix
# (use 1d_tool.py to get list of regressor colums)
set reg_cols = `1d_tool.py -infile X.nocensor.xmat.1D -show_indices_interest`
3dTstat -sum -prefix sum_ideal.1D X.nocensor.xmat.1D"[$reg_cols]"

# also, create a stimulus-only X-matrix, for easy review
1dcat X.nocensor.xmat.1D"[$reg_cols]" > X.stim.xmat.1D

# ============================ blur estimation =============================
# compute blur estimates
touch blur_est.$subj.1D   # start with empty file

# create directory for ACF curve files
mkdir files_ACF

# -- estimate blur for each run in epits --
touch blur.epits.1D

# restrict to uncensored TRs, per run
foreach run ( $runs )
    set trs = `1d_tool.py -infile X.xmat.1D -show_trs_uncensored encoded   \
                          -show_trs_run $run`
    if ( $trs == "" ) continue
    3dFWHMx -detrend -mask full_mask.$subj+tlrc                            \
            -ACF files_ACF/out.3dFWHMx.ACF.epits.r$run.1D                  \
            all_runs.$subj+tlrc"[$trs]" >> blur.epits.1D
end

# compute average FWHM blur (from every other row) and append
set blurs = ( `3dTstat -mean -prefix - blur.epits.1D'{0..$(2)}'\'` )
echo average epits FWHM blurs: $blurs
echo "$blurs   # epits FWHM blur estimates" >> blur_est.$subj.1D

# compute average ACF blur (from every other row) and append
set blurs = ( `3dTstat -mean -prefix - blur.epits.1D'{1..$(2)}'\'` )
echo average epits ACF blurs: $blurs
echo "$blurs   # epits ACF blur estimates" >> blur_est.$subj.1D


# ================== auto block: generate review scripts ===================

# generate a review script for the unprocessed EPI data
gen_epi_review.py -script @epi_review.$subj             \
    -dsets pb00.$subj.r*.tcat+orig.HEAD

# generate scripts to review single subject results
# (try with defaults, but do not allow bad exit status)
gen_ss_review_scripts.py -mot_limit 0.2 -out_limit 0.1  \
    -errts_dset errts.$subj.fanaticor+tlrc.HEAD -exit0

# ========================== auto block: finalize ==========================

# remove temporary files
\rm -f rm.*

# if the basic subject review script is here, run it
# (want this to be the last text output)
if ( -e @ss_review_basic ) ./@ss_review_basic |& tee out.ss_review.$subj.txt

# return to parent directory
cd ..

echo "execution finished: `date`"




# ==========================================================================
# script generated by the command:
#
# afni_proc.py -subj_id epi_proc.ACP1320 -blocks despike tshift tlrc volreg        \
#     blur mask regress -copy_anat vr_base_min_outlier+orig -dsets                 \
#     rsfMRI_R1.nii.gz rsfMRI_R2.nii.gz -bash -tlrc_base                           \
#     /data/brutus_data12/badhikari/ACP_Analy//scr_ACP/ENIGMA_Template.tlrc.nii.gz \
#     -volreg_align_to MIN_OUTLIER -volreg_tlrc_warp -volreg_warp_dxyz 2           \
#     -mask_import vent                                                            \
#     /data/brutus_data12/badhikari/ACP_Analy//scr_ACP/vent.erode.18.nii           \
#     -mask_import WM                                                              \
#     /data/brutus_data12/badhikari/ACP_Analy//scr_ACP/wm.erode.18.nii             \
#     -regress_ROI_PC vent 3 -regress_anaticor_fast -regress_anaticor_label        \
#     WM -regress_censor_motion 0.2 -regress_censor_outliers 0.1                   \
#     -regress_apply_mot_types demean deriv -regress_est_blur_epits
